package Demo;

//使用单独的锁对象

public class Demo_405 {
    public static void main(String[] args) throws InterruptedException {
        //初始化累加对象
        Counter405 counter = new Counter405();

        //创建两个线程对一个变量进行累加
        Thread t1 = new Thread(()->{
            //5万次
            for (int i=0;i<50000;i++){
                counter.increase();  //通过counter.increase()方法对counter进行递增操作，每次递增1并循环5万次
            }
        });

        Thread t2 = new Thread(()->{
            //5万次
            for (int i=0;i<50000;i++){
                counter.increase();  //通过counter.increase()方法对counter进行递增操作，每次递增1并循环5万次
            }
        });

        //启动线程
        t1.start();
        t2.start();

        //等待线程执行完成
        t1.join();
        t2.join();

        //查看运行结果
        System.out.println("count ="+counter.count);  //10万次
    }
}

class Counter405{
    //初始值是0
    public static int count = 0;

    //单独定义一个对象做为对象使用,用于后续的代码中实现同步操作
    Object locker = new Object();
    //累加方法
    public void increase(){
        //只锁定代码块{count++}
        synchronized (locker){  //这里synchronized的作用是:当多个线程同时访问和修改count变量时，为保证数据的一致性和正确性，
            // 需要进行同步操作，以避免出现并发访问导致的数据错误，通过锁定locker对象，同一时刻只有一个线程能够执行被锁定的代码块，
            //即对count继续递增操作，保证count的值正确修改
            count++;
        }
    }
}
